package reflect;

import org.w3c.dom.ls.LSOutput;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Scanner;

public class ReflectDemo1 {
/**
 * 程序的入口点
 * 该方法演示了如何使用反射来获取类的信息，包括类的名称、包以及方法
 * @param args 命令行参数，未在此方法中使用
 * @throws ClassNotFoundException 如果指定的类找不到，则抛出此异常
 */
public static void main(String[] args) throws ClassNotFoundException {

    Scanner sc = new Scanner(System.in);
    System.out.println("请输入一个类名：");
    String className = sc.nextLine();
    // 通过类名的字符串形式动态加载类，这里加载的是ArrayList类
    // 相比直接使用类字面量（如ArrayList.class），这种方式提供了更大的灵活性，可以在运行时决定加载哪个类
    Class cls = Class.forName(className);

    // 获取类的全限定名并打印
    // 全限定名包括了类的包名和简单类名，例如：java.util.ArrayList
    String name = cls.getName();
    System.out.println(name);

    // 获取类的简单名并打印
    // 简单名仅包括类名，不包含包名，例如：ArrayList
    name = cls.getSimpleName();
    System.out.println(name);

    // 获取类所属的包并打印
    // 这提供了类的组织结构信息，例如：java.util
    Package pack = cls.getPackage();
    System.out.println(pack);

    // 获取类的所有可访问方法，包括公共方法和受保护方法等
    // 这里使用反射来获取方法信息，展示了反射的强大功能
    Method[] methods = cls.getMethods();
    System.out.println("一共"+methods.length+"个方法");

    // 遍历并打印类的所有方法名
    // 这为动态分析类的行为提供了基础
    for(Method method:methods){
        System.out.println(method.getName());
    }
}


}
